package dbutils02;

import org.apache.commons.dbutils.BasicRowProcessor;
import org.apache.commons.dbutils.GenerousBeanProcessor;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Before;
import org.junit.Test;

import java.sql.SQLOutput;
import java.util.List;
import java.util.Map;

/**
 * BeanListHandler:将查询结果集中的每一行都封装成一个个JavaBean对象，再将这些对象存储到一个List集合中
 * MapHandler:将查询结果集的第一行封装到一个Map<String,Object>,Map中的key代表列名称,value代表该列对应的值
 * MapListHandler:将查询结果集的每一行数据都封装到一个Map<String,Object>中,Map中的key代表列名称,value代表该列对应的值
 *                  将所有的Map<String,Object>添加到一个List<Map<Strig,Object>>集合中,最终返回这个List<Map<Strig,Object>>集合
 * ScalarHandler:封装的是单行单列的数据,一般针对SQL语句中聚合函数结果集
 */
public class DBUtilsDemo04 {
    private QueryRunner qr;

    @Before
    public void initQueryRunner(){
        //先初始化QueryRunner对象
        qr = new QueryRunner(JDBCUtils.getDataSource());
    }

    @Test
    public void testBeanListHandler() throws Exception{
        //查询价格在3000~8000商品信息
        /**
         * 1.底层会拼接预编译SQL,将拼接好的SQL发送到数据库执行
         *   SELECT  * FROM product WHERE price BETWEEN 30000 AND 8000;
         * 2.将查询结果集中的每行数据都封装到一个Product对象中,再将这些对象添加到一个List集合中
         * 3.最终返回这个List集合
         */
        List<Product> products = qr.query("SELECT * FROM product WHERE price BETWEEN ? AND ?",
                new BeanListHandler<Product>(Product.class,
                        new BasicRowProcessor(new GenerousBeanProcessor())),
                3000, 8000);

        //遍历集合
        products.stream().forEach(System.out::println);
    }

    @Test
    public void testMapHandler() throws Exception{
        //查询所有的商品
        Map<String, Object> map = qr.query("SELECT * FROM product", new MapHandler(new BasicRowProcessor(new GenerousBeanProcessor())));

        //遍历map
        map.forEach((key,value)-> System.out.println(key+"="+value));

    }

    @Test
    public void testMapListHandler() throws Exception{
        //查询所有的商品
        List<Map<String, Object>> list = qr.query("SELECT * FROM product", new MapListHandler(new BasicRowProcessor(new GenerousBeanProcessor())));

        //遍历map
        list.stream().forEach(System.out::println);
    }

    @Test
    public void testScalarHandler() throws Exception{
        //查询商品表商品总数
        Long count = qr.query("SELECT COUNT(*) FROM product", new ScalarHandler<Long>());//ScalarHandler类型为聚合函数的类型

        //打印商品总数
        System.out.println(count);
    }
}
